using System.Threading.Tasks;

namespace Matrix.Configuration.Services
{
    /// <summary>
    /// 幂等事件处理器接口
    /// 确保事件处理的幂等性，避免重复处理
    /// </summary>
    public interface IIdempotentEventProcessor
    {
        /// <summary>
        /// 检查事件是否已处理
        /// </summary>
        /// <param name="eventId">事件ID</param>
        /// <returns>如果事件已处理则返回true，否则返回false</returns>
        Task<bool> IsEventProcessedAsync(string eventId);

        /// <summary>
        /// 标记事件为已处理
        /// </summary>
        /// <param name="eventId">事件ID</param>
        /// <param name="expiration">过期时间</param>
        Task MarkEventAsProcessedAsync(string eventId, System.TimeSpan? expiration = null);

        /// <summary>
        /// 幂等地处理事件
        /// </summary>
        /// <param name="eventId">事件ID</param>
        /// <param name="handler">事件处理函数</param>
        /// <returns>如果事件被处理则返回true，如果事件已存在则返回false</returns>
        Task<bool> ProcessEventAsync(string eventId, System.Func<Task> handler);

        /// <summary>
        /// 幂等地处理事件（带返回值）
        /// </summary>
        /// <typeparam name="T">返回值类型</typeparam>
        /// <param name="eventId">事件ID</param>
        /// <param name="handler">事件处理函数</param>
        /// <returns>事件处理结果，如果事件已存在则返回默认值</returns>
        Task<T?> ProcessEventAsync<T>(string eventId, System.Func<Task<T>> handler) where T : class;

        /// <summary>
        /// 清理过期的事件处理记录
        /// </summary>
        Task CleanupExpiredRecordsAsync();
    }
}